<?php
require('urlunpack.php');
/*
       tvkontakte 0.1i
       vkontakte.ru status updater from twitter
       made by Vladimir Smirnoff
       http://orl.sumy.ua
       mail@smirnoff.sumy.ua
       improved by Kichrum
       http://Kichrum.org.ua
       and improved again by Hakimovis
       http://unblog.ikito.ru/blog
*/
# Конфигурация - ОТРЕДАКТИРУЙ!
define ('TWITTER_USERNAME','hakimovis'); // mylogin заменить на свой Логин в Twitter
define ('VKONTAKTE_LOGIN','ikito@mail.ru'); // user@mail.ua заменить на свой E-mail на Vkontakte.ru
define ('VKONTAKTE_PASSWORD','***'); // secret  заменить на свой Пароль на Vkontakte.ru
define ('PREPEND_WORD','tw: '); // From twitter заменить на слова,  которые будут перед статусом. Максимальная длина: 20 символов с пробелами = 160 во vkontakte - 140 в twitter
# Конфигурация выполнена.
# Дальше можно не читать :)
# Объявляем Дуровский UserAPI

// Эти класс и метод можно заменить на новые, использующие oauth. 
class vkuserapi {
       private $curlh = null;
       public $uid = null;
       private $sid = null;
       public function __construct ($login,$password) {
         $this->curlh = curl_init();
         $request = 'http://login.userapi.com/auth?site=2&login=force&pass='.urlencode($password).'&email='.urlencode($login);
         // опции cURL-а, половина не нужна.
         curl_setopt($this->curlh, CURLOPT_URL,$request);
         curl_setopt($this->curlh, CURLOPT_FAILONERROR, true);
         curl_setopt($this->curlh, CURLOPT_FOLLOWLOCATION, false);
         curl_setopt($this->curlh, CURLOPT_RETURNTRANSFER, true);
         curl_setopt($this->curlh, CURLOPT_POST, false);
         curl_setopt($this->curlh, CURLOPT_HEADER, true);
         $auth_result = curl_exec($this->curlh); // загружаем результат

         if (preg_match("/remixmid=(\d+)/", $auth_result, $matches)) $this->uid = $matches[1];
         if (preg_match("/.*;sid=(\w*)/", $auth_result, $matches)) $this->sid = $matches[1];
       }
       public function call ($func,$params) {
         curl_setopt($this->curlh, CURLOPT_HEADER, false);
         $request = 'http://userapi.com/data?act='.$func.'&'.http_build_query ($params).'&sid='.$this->sid;
         curl_setopt($this->curlh, CURLOPT_URL,$request);
         $result = curl_exec($this->curlh);
         return json_decode($result);
       }
       public function __destruct () {
         $request = 'http://login.userapi.com/auth?login=logout&site=2&sid='.$this->sid;
         curl_setopt($this->curlh, CURLOPT_URL,$request);
         curl_exec($this->curlh);
         curl_close ($this->curlh);
       }
};

function VKPost($textArr) {
  if ( count($textArr)>0 ) {
    $vkontakte = new vkuserapi (VKONTAKTE_LOGIN, VKONTAKTE_PASSWORD); // Логинимся
    foreach($textArr as $num=>$text) {
      $params = array( 
        'ts'=>time(),
        'text'=>PREPEND_WORD.$text
      );
      $vkontakte->call ('set_activity', $params); // Обновляем статус
    };
    unset ($vkontakte); // Выходим из Vkontakte.ru
    echo "Updated to VK.\n";
  } else echo "Nothing to update...\n";
};

$rssFormat = ".rss"; // вдруг нам понадобится RSS?
$jsonFormat = ".json";
$msgLink = 'https://api.twitter.com/1/statuses/user_timeline'.$jsonFormat.'?screen_name='.TWITTER_USERNAME.'&include_rts=1';
$response = file_get_contents($msgLink); // загружаем таймлайн (теперь - с ретвитами!)
$timeline = json_decode($response, true);

$toRepost = array(); // сюда будем складывать новые твиты

// Читаем из файла последний id сообщения. Если не получилось, считаем его за 0.
// В этом случае, на стену ничего не попадет, зато запомним последний id твита для следующего раза.
$f = file(dirname(__FILE__).'/last_tw_id.txt');
if ($f) {$lastPostedId = $f[0];} else {$lastPostedId = false;}

print "last posted id: $lastPostedId \n";
print "loaded ".count($timeline)." tweets\n";

$lastLoadedId = 0;
foreach ($timeline as $num => $msg) {
  $msgId = $msg["id_str"];
  $text = $msg['text'];
  $inReply = $msg['in_reply_to_status_id']; //реплай или нет
  $atPos = strpos($text,'@'); //позиция собачки (если она в начале, значит тоже реплай)
  
  // если native retweet, то получаем оригинальный текст твита, иначе он придет обрезанный
  if (isset($msg['retweeted_status']['text'])) $text = $msg['retweeted_status']['text'];

  // gmp_cmp нужен чтобы сравнивать большие числа вроде id у сообщений
  // gmp_cmp > 0 значит что первый аргумент больше второго
  if (gmp_cmp($msgId,$lastLoadedId)>0) { 
    $lastLoadedId = $msgId; // запоминаем наибольший id сообщения
  };
  // если удалось прочитать последний id из файла и id сообщения больше него
  // если не реплай, то добавляем текст в список для размещения на стене вконтакта
  if ($lastPostedId && gmp_cmp($msgId,$lastPostedId)>0 && !$inReply && $atPos!==0 && $atPos!==1) 
    {
      $toRepost[] = unpack_urls($text); // распаковываем URL-ы заодно
      echo $msgId." ".$text."\n";
    };
};

$file = fopen(dirname(__FILE__).'/last_tw_id.txt', 'w');
fwrite($file, $lastLoadedId); // сохраняем последний id сообщения
fclose($file);

VKPost( array_reverse($toRepost) ); // отправляем на стену "перевернутый" массив

?>
